#ifndef ORM_H
#define ORM_H

#include <QObject>
#include <QMetaObject>
#include <QMetaProperty>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QDebug>
#include <QSet>
#include <QMap>

// 前向声明
class ORMObject;

// 对象工厂函数类型
typedef std::function<ORMObject*()> ObjectFactory;

class ORMObject : public QObject
{
    Q_OBJECT
public:
    explicit ORMObject(QObject *parent = nullptr);
    virtual ~ORMObject();

    // 注册类型工厂
    static void registerType(const QString& className, ObjectFactory factory);
    static ORMObject* createObject(const QString& className);

    // 基本CRUD操作
    virtual bool save();
    virtual bool load(int id);
    virtual bool remove();

    // 获取外键值
    virtual QVariant foreignKey() const;

    // 设置表名
    void setTableName(const QString& tableName) { m_tableName = tableName; }
    QString tableName() const { return m_tableName; }

    // ID访问器
    int id() const { return m_id; }
    void setId(int id) { m_id = id; }

protected:
    // 保存和加载子对象
    virtual void saveChildren();
    virtual void loadChildren();

    // 集合属性处理
    template<typename T>
    bool saveCollectionProperty(const QString& propertyName, const QString& foreignKeyName);

    template<typename T>
    bool loadCollectionProperty(const QString& propertyName, const QString& foreignKeyName);

    // 表操作
    bool createTable();
    QString generateCreateTableSQL();
    QStringList getPropertyNames() const;

private:
    int m_id;
    QString m_tableName;
    static QHash<QString, ObjectFactory> s_typeFactories;
};

// 辅助函数：解析集合元素类型
QString parseElementType(const QString& typeName);

// 类型注册宏
#define REGISTER_ORM_TYPE(className) \
    static struct className##Registrar { \
        className##Registrar() { \
            ORMObject::registerType(#className, []() { return new className(); }); \
        } \
    } className##RegistrarInstance;

#endif // ORM_H    